<?php
namespace app\data_magic\data;

use think\Db;
use app\data_magic\extension\Filter as FilterExtension;


/**
 * 过滤器
 * @property string $id 过滤器ID
 * @property string $table_id 关联表ID
 * @property string $name 过滤器名称
 * @property string $title 过滤器标题
 * @property string $describe 描述
 * @property string $type 过滤器类型
 * @property string $fields 过滤器关联字段
 * @property string $params 过滤器参数
 */
class Filter extends DataRow
{
    /**
     * @var string $value 过滤器中输入的值
     */
    public $value="";

    /**
     * 从数据库加载过滤器列表
     * @param string $ids 过滤器ID
     * @return self[]
     */
    static public function loadFilterList($ids)
    {
        $list=Db::table("dm_filter")->where("id in ($ids)")->select();
        if(!$list){
            return [];
        }
        $filters=[];
        foreach($list as $item){
            $filters[]=new self($item);
        }
        return $filters;
    }

    /**
     * 解析输入的搜索条件
     * @param string $table_id 表ID
     * @param Field[] $fields 字段列表
     * @param array $data 搜索条件
     */
    static public function getWhere($table_id,$fields,$data)
    {
        //按照设定的搜索条件搜索
        $filters=Db::table("dm_filter")->where(["table_id"=>$table_id])->select();
        $where_array=[];
        $extension=new FilterExtension();
        foreach($filters as $item){
            if(!isset($data[$item["name"]]) || $data[$item["name"]]==="" ){
                continue;
            }
            
            $fields_id_list=explode(",",$item["fields"]);
            $fields_name_list=[];
            foreach($fields as $field){
                if(in_array($field->id,$fields_id_list)){
                    $fields_name_list[]=$field->name;
                }
            }
            if(method_exists($extension,$item["type"])){
                $sub_where=call_user_func([$extension,$item["type"]],$fields_name_list,$data[$item["name"]]);
                if($sub_where){
                    $where_array[]=$sub_where;
                }
            }
            unset($data[$item["name"]]);
        }
        //不符合设定的搜索条件的参数，搜索指定的字段
        foreach($fields as $field){
            if(!isset($data[$field->name]) || $data[$field->name]==="" ){
                continue;
            }
            $where_array[]="`".$field->name."` = '".$data[$field->name]."'";
        }
        return $where_array;
    }
}
